package model;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JOptionPane;
import javax.swing.Timer;

/**
 * De klasse Game is verantwoordelijk voor: de toetsen AFVANGEN de speler
 * VERTELLEN dat hij moet bewegen de happer STOPPEN de happer BEWEGEN het
 * speelveld OPSLAAN houden het paneel VERTELLEN dat hijzichzelf moet tekennen
 *
 * Game heeft kennis van de velden de lvls en het paneel
 *
 * Author Misja, Bob.
 */
public class Game implements KeyListener, ActionListener {

    private ArrayList<Field> fields;
    private Level level;
    private FieldPanel panel;
    public Timer timer;

    public Game(FieldPanel panel) {
        fields = new ArrayList<>();
        level = new Level();
        this.panel = panel;
        fields = level.generateLevel();
        timer = new Timer(500, this);
    }

    /*
     * Tekent het speel veld
     */
    public void draw() {

        this.panel.setFields(fields);
        this.panel.repaint();

    }

    /*
     * Vind een speler via zijn object type
     */
    public Part findPlayer() {

        Iterator<Field> it = this.fields.iterator();
        while (it.hasNext()) {
            Field f = it.next();
            if (f.getPart() instanceof Player) {
                return f.getPart();
            }
        }
        return null;
    }

    /*
     * Vind een speler via zijn object type
     */
    public Enemy findEnemy() {

        Iterator<Field> it = this.fields.iterator();
        while (it.hasNext()) {
            Field f = it.next();
            if (f.getPart() instanceof Enemy) {
                return ((Enemy) f.getPart());
            }
        }
        return null;
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
    }

    /*
     * Vangt de toets aanslagen af en beweegt de speler
     */
    @Override
    public void keyReleased(KeyEvent e) {
        if (this.timer.isRunning()) {
            switch (e.getKeyCode()) {
                case KeyEvent.VK_UP:
                    this.findPlayer().movePart("UP");
                    break;
                case KeyEvent.VK_DOWN:
                    this.findPlayer().movePart("DOWN");
                    break;
                case KeyEvent.VK_LEFT:
                    this.findPlayer().movePart("LEFT");
                    break;
                case KeyEvent.VK_RIGHT:
                    this.findPlayer().movePart("RIGHT");
                    break;
            }
            draw();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String actionPerformed = findEnemy().moveEnemy();
        draw();
        switch (actionPerformed) {
            case "CANNOTMOVE":
                timer.stop();
                JOptionPane.showMessageDialog(panel, "GEWONNEN");
                break;
            case "ATEPLAYER":
                timer.stop(); 
                JOptionPane.showMessageDialog(panel, "VERLOREN");
                break;
            case "MOVED":
                break;
        }                      
    }
}
